package ar.uba.fi.tonyvaliente.signature.query;

import java.util.BitSet;

/**
 * Filtro que une otros dos mediante un operador
 * logico binario. Funciona obteniendo el resultado
 * de aplicar dicho operador a los resultados devueltos
 * por los dos filtros que asocia.
 * No descarta falsos positivos.
 * @author dmorello
 */
abstract class SignatureBinaryOperatorFilter extends SignatureFilter {
	
	// Filtros a los cuales aplicar el operador
	protected SignatureFilter filter1;
	protected SignatureFilter filter2;
	
	public SignatureBinaryOperatorFilter(SignatureFilter filter1,
			SignatureFilter filter2, boolean negated) {
		super(negated);
		this.filter1 = filter1;
		this.filter2 = filter2;
	}

	@Override
	public final boolean eval(BitSet docSignature) {
		boolean eval1 = filter1.eval(docSignature);
		boolean eval2 = filter2.eval(docSignature);
		return applyOperator(eval1, eval2);
	}
	
	/**
	 * Aplica un operador logico binario cualquiera sobre dos
	 * operandos booleanos.
	 * @param eval1 valor devuelto por filter1
	 * @param eval2 valor devuelto por filter2
	 * @return resultado de aplicar el operador logico a eval1 y eval2
	 */
	protected abstract boolean applyOperator(boolean eval1, boolean eval2);

}
